home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / frexp.c < prev    next >
C/C++ Source or Header  |  1992-03-27  |  1KB  |  74 lines

  1. /* 
  2.  * frexp.c --
  3.  *
  4.  *    frexp math routine..
  5.  *
  6.  */
  7.  
  8. #ifndef lint
  9. static char rcsid[] = "$Header: /sprite/src/lib/c/etc/RCS/frexp.c,v 1.3 92/03/27 13:37:07 rab Exp $ SPRITE (Berkeley)";
  10. #endif /* not lint */
  11.  
  12. #include <math.h>
  13.  
  14. /* 
  15.  * math.h provides inline definitions for using the 68881 coprocessor 
  16.  * on a sun3.  frexp is one of the functions that gets inlined.
  17.  */
  18.  
  19. #if defined(__STDC__) && defined(sun3) && !defined(__STRICT_ANSI__) \
  20.   && !defined(__SOFT_FLOAT__)
  21.  
  22. /* use the inline definition */
  23.  
  24. #else
  25.  
  26.  
  27. /*
  28.  *----------------------------------------------------------------------
  29.  *
  30.  * frexp --
  31.  *
  32.  *    Describe the given argument as two numbers, x and i, where 
  33.  *    arg = x * (2**i).
  34.  *
  35.  * Results:
  36.  *    Returns the multiplier "x", which is always less than 1.0 in 
  37.  *    absolute value.
  38.  *
  39.  * Side effects:
  40.  *    Stores the integer exponent "i" at the address pointed to.
  41.  *
  42.  *----------------------------------------------------------------------
  43.  */
  44.  
  45. double
  46. frexp(x, i)
  47.     double x;
  48.     int *i;
  49. {
  50.     int neg, j;
  51.  
  52.     j = 0;
  53.     neg = 0;
  54.     if (x < 0) {
  55.     x = -x;
  56.     neg = 1;
  57.     }
  58.     if (x > 1.0) {
  59.     while (x > 1) {
  60.         ++j;
  61.         x /= 2;
  62.     }
  63.     } else if (x < 0.5) {
  64.     while(x < 0.5) {
  65.         --j;
  66.         x *= 2;
  67.     }
  68.     }
  69.     *i = j;
  70.     return neg ? -x : x;
  71. }
  72.  
  73. #endif /* inline test */
  74.